package com.opmsys.controller;

import com.opmsys.pojo.dto.LoginInfo;
import com.opmsys.pojo.vo.LoginResponse;
import com.opmsys.pojo.vo.PersonInfo;
import com.opmsys.pojo.entity.Person;
import com.opmsys.result.Result;
import com.opmsys.service.PersonService;
import com.opmsys.utils.authEnum.StatusEnum;
import com.opmsys.utils.jsonWebToken.JsonWebTokenUtil;
import com.opmsys.utils.redis.RedisUtil;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/login")
public class LoginController {
    private final PersonService personService;
    private final JsonWebTokenUtil jsonWebTokenUtil;
    private final RedisUtil redisUtil;

    public LoginController(PersonService personService, JsonWebTokenUtil jsonWebTokenUtil, RedisUtil redisUtil) {
        this.personService = personService;
        this.jsonWebTokenUtil = jsonWebTokenUtil;
        this.redisUtil = redisUtil;
    }

    /**
     * 登录检验账号密码
     * @param loginInfo
     * @return
     */
    @PostMapping()
    public Result<Object> login(LoginInfo loginInfo){
        Person person = personService.selectPersonByNumAndPassword(loginInfo);

//      1、确保用户账号存在
        if (person == null){
            return Result.error("登录失败，请检查用户名或密码！");
        }

//      2、确保账号处于可用状态
        if(person.getStatus().equals(StatusEnum.BAN.status)){
            return Result.error("您的账号已被禁止使用，请联系管理员！");
        }

//      3、确保给用户分配的JWT被正确存储（违背了JWT的初衷，这是为管理员禁用账号功能所作的妥协）
        String JWT = jsonWebTokenUtil.createAccessJWTByUId(person.getNumber(),person.getStatus());
        boolean isRedisStoreSuccess = redisUtil.setWithExpire(person.getNumber().toString(),JWT);//将JWT存入redis，默认有效期为15天
        if (!isRedisStoreSuccess){
            return Result.error("登录信息录入失败，请检查后重试！");
        }

//      4、封装返回体
        LoginResponse loginResponse = new LoginResponse();
        loginResponse.setPersonInfo(new PersonInfo(person));//登录人的信息
        loginResponse.setJWT(JWT);//为登录者分配的JWT

        return Result.successWithMsgAndData("恭喜你，登录成功!",loginResponse);

    }
}
